package kb_proj

import (
	"context"
	"fmt"
	mCache "service/model/hr_cache"
	model "service/model/kb_pro"

	gupb "gitee.com/cloudapex/protos/hr_cache/pb"
	gpb "gitee.com/cloudapex/protos/pro_know/pb"
	"gitee.com/cloudapex/ulern/util"

	"service/model/mod"

	"gitee.com/cloudapex/ulern/htp"
	"github.com/gin-gonic/gin"
)

/*
 * 描述: 项目知识库列表
 * 路由: /kb_proj/pro_list
 * 方法: POST
 *********************************************************************/

type ProClassList struct {
	Page    int64  `form:"page" json:"page" binding:"required"`        //页码
	Count   int64  `form:"pnum" json:"pnum" binding:"required"`        //页条数
	StartId int64  `form:"startId" json:"startId" binding:"omitempty"` //起始Id
	Name    string `form:"name" json:"name" binding:"omitempty"`       // 版型名称
	PId     int64  `form:"pid" json:"pid" binding:"omitempty"`         //项目ID upgRade
	UpgRade int64  `form:"upgRade" json:"upgRade" binding:"omitempty"` //是否升级版
	Order   int64  `form:"order" json:"order" binding:"omitempty"`     //排序字段名：1 创建时间 2.报名开始时间 3报名截止时间 4.价格 5.id
	Orule   int    `form:"orule" json:"orule" binding:"omitempty"`     //排序字段名 数据端（1.降序 2.升序）   service (1.升序 2.降序)
	Type    int64  `form:"typ" json:"typ" binding:"omitempty"`         //0 不加入时间过滤  1 时间过滤
}
type ProClassRetItem struct {
	gpb.ProClassRes
}

func (this *ProClassList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	var proclas gpb.ProClassReq
	var class gpb.Class
	var pro gpb.Project
	class.Name = this.Name
	class.PId = this.PId
	class.UpgRade = this.UpgRade
	proclas.Class = &class
	proclas.Pro = &pro
	prolist := gpb.ProListReq{ProClassReq: &proclas, Page: this.Page, Count: this.Count, StartId: this.StartId, Type: this.Type}
	prolist.DesClum = this.Order
	prolist.IsDes = 2
	if this.Orule == 0 {
		prolist.IsDes = 1
	}
	rep, err := model.ProClass.GetProClassList(ctx, &prolist)
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	items := []ProClassRetItem{}
	for _, it := range rep.ProList {
		item := ProClassRetItem{}
		util.Convert(&item, it)
		items = append(items, item)
	}
	return htp.RespOK("", &struct {
		Total int         `json:"total"`
		List  interface{} `json:"list"`
	}{int(rep.Count), items})
}

/**
 *说明：获取班型课程
 *参数：1.Class 班型信息
 *     2.Project 项目信息
 *
 */
type ClassCourList struct {
	CID     int64  `form:"cid" json:"cid" binding:"omitempty"`      //公司ID
	ClassId int64  `form:"cas_id" json:"cas_id" binding:"required"` //班型ID
	Order   int64  `form:"order" json:"order" binding:"omitempty"`  //排序字段名：1 创建时间 2.报名开始时间 3报名截止时间 4.价格 5.id
	Orule   int    `form:"orule" json:"orule" binding:"omitempty"`  //排序字段名：1.降序 2.升序
	Page    int64  `form:"page" json:"page" binding:"required"`     //页码
	Count   int64  `form:"pnum" json:"pnum" binding:"required"`     //页条数
	Name    string `form:"name" json:"name" binding:"omitempty"`    //课程名称
	SId     int64  `form:"sid" json:"sid" binding:"omitempty"`      //科目名称
}

type ClassCourItem struct {
	gpb.Course
}

func (this *ClassCourList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	jwtUser := mod.CurrUser(c)
	var cours gpb.Course
	cours.Name = this.Name
	cours.SId = this.SId
	sysreq := gpb.ClassCourReq{
		Course:  &cours,
		CId:     jwtUser.CId,
		ClassId: this.ClassId,
		Page:    this.Page,
		Count:   this.Count}
	sysreq.DesClum = this.Order
	sysreq.IsDes = 2
	if this.Orule == 0 {
		sysreq.IsDes = 1
	}
	rep, err := model.ProClass.ClassCourList(ctx, &sysreq)
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	items := []ClassCourItem{}
	for _, it := range rep.CourList {
		item := ClassCourItem{}
		util.Convert(&item, it)
		items = append(items, item)
	}
	//return htp.RespOK("", rep)
	return htp.RespOK("", &struct {
		Total int         `json:"total"`
		List  interface{} `json:"list"`
	}{int(rep.Count), items})
}

//*
//说明：获取班型下科目
//参数：1.ClassKemuReq
//
type ClassKemuList struct {
	CID int64 `form:"cid" json:"cid" binding:"required"` //班型Id
}

func (this *ClassKemuList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	fmt.Println("================================================ ")
	fmt.Println(this.CID, "===========   班型id ")
	fmt.Println("================================================ ")
	rep, err := model.ProClass.ClassKemuList(ctx, &gpb.ClassKemuReq{ClassId: this.CID})
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", rep)
}

/*
 * 描述: 七牛云获取token
 * 路由: /kb_proj/qin_token
 * 方法: POST
 *********************************************************************/
type QiNiuToken struct {
}

func (this *QiNiuToken) Handle(c *gin.Context, ctx context.Context) htp.Response {
	rep, err := mod.Qiniu.QiniuToken()
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", rep)
}

/*
 * 描述: 七牛云文件删除
 * 路由: /kb_proj/qin_del
 * 方法: POST
 *********************************************************************/
type QiNiuDel struct {
	FileName string `json:"file_name" form:"file_name"`
}

func (this *QiNiuDel) Handle(c *gin.Context, ctx context.Context) htp.Response {
	rep, err := mod.Qiniu.QinNiuDelete(this.FileName)
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", rep)
}

/**
 * 说明：获取项目列表
 * 参数：1.cId  公司ID（备用）
 */
type GetProList struct {
	Page  int64 `form:"page" json:"page" binding:"required"` //页码
	Count int64 `form:"pnum" json:"pnum" binding:"required"` //页条数
}

func (this *GetProList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	jwtUser := mod.CurrUser(c)
	req, err := model.ProClass.GetProList(ctx, &gpb.ProLReq{CId: jwtUser.CId, Page: this.Page, Count: this.Count})
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", req)

}

/**
 * 说明：获取列表
 * 参数：1.type 类别Id (1项目知识,2:报考条件 3.成单秘籍)
 *      2.cId  公司ID
 *      3.page   页码
 *      4.count  单页获取数量
 *      5.startId  起始ID
 *		6.pid 项目ID  title 标题  knowType 知识类型
 *      7.其他搜索条件封装到proKnowReq传入
 */
type GetProKnowList struct {
	Types    int64  `form:"type" json:"type" binding:"required"`
	Page     int64  `form:"page" json:"page" binding:"required"`
	Count    int64  `form:"pnum" json:"pnum" binding:"required"`
	StartId  int64  `form:"startId" json:"startId" binding:"omitempty"`
	PID      int64  `form:"pid" json:"pid" binding:"omitempty"`
	Title    string `form:"title" json:"title" binding:"omitempty"`
	KnowType int64  `form:"knowType" json:"knowType" binding:"omitempty"`
	PNmae    string `form:"pname" json:"pname" binding:"omitempty"`
	Order    int64  `form:"order" json:"order" binding:"omitempty"` // 排序字段名：1.时间 2.id
	Orule    int    `form:"orule" json:"orule" binding:"omitempty"`
	State    int64  `form:"state" json:"state"` //状态： 1 草稿, 2 发布，3 停用， 4 删除
}
type ProjectZh struct {
	Id   int64
	Name string
}
type ListRetItem struct {
	//gpb.ProKnowRes
	PNmae    string `form:"pname" json:"pname" binding:"omitempty"`
	UserName string `json:"userName"`

	Id       int64  `json:"id"`       //自增id
	CId      int64  `json:"cId"`      //公司ID
	Title    string `json:"title"`    //标题
	UId      int64  `json:"uId"`      //操作用户ID
	Content  string `json:"content"`  //内容（ 富文本编辑内容 ）
	State    int64  `json:"state"`    //状态： 1 草稿, 2 发布，3 停用， 4 删除
	At       int64  `json:"at"`       //数据入库时间
	PId      int64  `json:"pId"`      //项目ID
	FileUrl  string `json:"fileUrl"`  //附件 多个，分割 (员工手册需要)
	KnowType int64  `json:"knowType"` // 1项目知识,3.成单秘籍 有此字段  注释：1.(1 -- 知识类型 1: 项目类型，2: 常见问题，3: 相关资料，4: 直播课表,5 :其他)   注释：3.(-- 知识类型 1: 微信聊天，2: 常见问题，3: 话术，4: 其他)
	Status   int64  `json:"-"`        //状态值 1 数据库错误 0 无数据 3 数据已存在 4 参数错误 （暂定）
	Message  string `json:"-"`        //状态说明
}

func (this *GetProKnowList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	var prok gpb.ProKnowReq
	jwtUser := mod.CurrUser(c)
	prok.CId = jwtUser.CId
	prok.UId = jwtUser.UId
	prok.PId = this.PID
	prok.State = this.State
	prok.KnowType = this.KnowType
	prok.Title = this.Title
	sysreq := gpb.ProKnowListReq{
		ProKnowReq: &prok,
		Type:       this.Types,
		Page:       this.Page,
		Count:      this.Count,
		StartId:    this.StartId}
	sysreq.DesClum = this.Order
	sysreq.IsDes = 2
	if this.Orule == 0 {
		sysreq.IsDes = 1
	}
	rep, err := model.ProKnowLe.GetProKnowList(ctx, &sysreq)
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	userlist := make([]ListRetItem, 0)
	project, err := model.ProClass.GetProList(ctx, &gpb.ProLReq{CId: jwtUser.CId})

	val := make([]ProjectZh, 0)
	for _, v := range project.ProList {
		val = append(val, ProjectZh{v.Id, v.Name})
	}
	//用户名称
	var nameList []NameInfo
	nameList = make([]NameInfo, 0)
	for _, s := range rep.ProList {
		var res string
		res, err, nameList = GetInfoNew(ctx, s.UId, nameList)
		if err != nil {
			return htp.RespModelErr("", err)
		}
		var info ListRetItem
		if res != "" {
			info.UserName = res
		}
		util.Convert(&info, s)
		for _, i := range val {
			if i.Id == s.PId {
				info.PNmae = i.Name
			}
		}
		userlist = append(userlist, info)
	}
	return htp.RespOK("", &struct {
		Total int         `json:"total"`
		List  interface{} `json:"list"`
	}{int(rep.Count), userlist})
}

/**
 * 说明：删除数据
 * 参数：1.type 类别Id (1项目知识,2:报考条件 3.成单秘籍)
 *      3.Id  数据ID
 */
type DelProKnow struct {
	Type int64 `form:"type" json:"type" binding:"required"`
	ID   int64 `form:"id" json:"id" binding:"required"`
}

func (this *DelProKnow) Handle(c *gin.Context, ctx context.Context) htp.Response {
	jwtUser := mod.CurrUser(c)
	req, err := model.ProKnowLe.DelProKnow(ctx, &gpb.ProKnowReq{Type: this.Type, CId: jwtUser.CId, Id: this.ID})
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", req)

}

/**
 * 说明：添加数据
 * 参数：1.ProKnowReq (除ID所有参数)
 */

type AddProKnow struct {
	Title   string `form:"title" json:"title" binding:"required"`     //标题
	Content string `form:"content" json:"content" binding:"required"` //内容（ 富文本编辑内容 ）
	//State    int64  `form:"state" json:"state" binding:"omitempty"`       //状态： 1 草稿, 2 发布，3 停用， 4 删除
	Type     int64  `form:"type" json:"type" binding:"required"`          //(1项目知识,2:报考条件 3.成单秘籍)
	FileUrl  string `form:"fileUrl" json:"fileUrl" binding:"omitempty"`   //附件 多个，分割 (员工手册需要)
	PID      int64  `form:"pid" json:"pid" binding:"required"`            //项目ID
	KnowType int64  `form:"knowType" json:"knowType" binding:"omitempty"` // 1项目知识,3.成单秘籍 有此字段  注释：1.(1 -- 知识类型 1: 项目类型，2: 常见问题，3: 相关资料，4: 直播课表)   注释：3.(-- 知识类型 1: 微信聊天，2: 常见问题，3: 话术，4: 其他)
}

func (this *AddProKnow) Handle(c *gin.Context, ctx context.Context) htp.Response {
	var prok gpb.ProKnowReq
	jwtUser := mod.CurrUser(c)
	prok.CId = jwtUser.CId
	prok.Title = this.Title
	prok.UId = jwtUser.UId
	prok.Content = this.Content
	prok.State = 1
	prok.Type = this.Type
	prok.FileUrl = this.FileUrl
	prok.PId = this.PID
	prok.KnowType = this.KnowType
	fmt.Println("=========添加数据========= :", prok, "操作人id :    ", jwtUser.UId)
	req, err := model.ProKnowLe.AddProKnow(ctx, &prok)
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", req)
}

/**
 * 说明：获取单条数据
 * 参数：1.type 类别Id (1项目知识,2:报考条件 3.成单秘籍)
 *      2.cid
 *      3.Id  数据ID
 */

type GetProKnow struct {
	Type int64 `form:"type" json:"type" binding:"omitempty"`
	Id   int64 `form:"id" json:"id" binding:"omitempty"`
}

func (this *GetProKnow) Handle(c *gin.Context, ctx context.Context) htp.Response {
	jwtUser := mod.CurrUser(c)
	req, err := model.ProKnowLe.GetProKnow(ctx, &gpb.ProKnowReq{Type: this.Type, CId: jwtUser.CId, Id: this.Id})
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", req)
}

/**
 * 说明：编辑数据
 * 参数：1.type  类别Id (1项目知识,2:报考条件 3.成单秘籍)
 *      2.id    必选
 *      3.title
 *      4.content
 *      5.state  (用于改变状态)
 */
type EditProKnow struct {
	Type     int64  `form:"type" json:"type" binding:"required"`
	Id       int64  `form:"id" json:"id" binding:"required"`
	Title    string `form:"title" json:"title" binding:"omitempty"`
	Content  string `form:"content" json:"content" binding:"omitempty"`
	State    int64  `form:"state" json:"state" binding:"omitempty"`
	KnowType int64  `form:"knowType" json:"knowType" binding:"omitempty"` // 1项目知识,3.成单秘籍 有此字段  注释：1.(1 -- 知识类型 1: 项目类型，2: 常见问题，3: 相关资料，4: 直播课表)   注释：3.(-- 知识类型 1: 微信聊天，2: 常见问题，3: 话术，4: 其他)
	PID      int64  `form:"pid" json:"pid" binding:"omitempty"`           //项目ID
	FileUrl  string `form:"fileUrl" json:"fileUrl" binding:"omitempty"`
}

func (this *EditProKnow) Handle(c *gin.Context, ctx context.Context) htp.Response {
	fmt.Println(this, "：        ----------------------编辑数据")
	jwtUser := mod.CurrUser(c)
	req, err := model.ProKnowLe.EditProKnow(
		ctx, &gpb.ProKnowReq{
			Type:     this.Type,
			Id:       this.Id,
			Title:    this.Title,
			Content:  this.Content,
			State:    this.State,
			KnowType: this.KnowType,
			FileUrl:  this.FileUrl,
			PId:      this.PID,
			CId:      jwtUser.CId})
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", req)
}

/**
 * 说明：获取学历列表
 * 参数：1.cId  公司ID（备用）
 *
 */

type GetSchList struct {
	Page    int64  `form:"page" json:"page" binding:"required"` //页码
	Count   int64  `form:"pnum" json:"pnum" binding:"required"` //页条数
	SchName string `form:"sch_name" json:"sch_name"`            //学校名称
	MName   string `form:"m_name" json:"m_name"`                //学历名称
}

type SchoolRetItem struct {
	gpb.SchoolMajoListRes
}

func (this *GetSchList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	jwtUser := mod.CurrUser(c)
	var sch gpb.School
	var mag gpb.Major
	mag.Name = this.MName
	sch.Name = this.SchName
	req, err := model.ProClass.GetSchList(ctx, &gpb.SchoolMajorReq{Major: &mag, Sch: &sch, CId: jwtUser.CId, Count: this.Count, Page: this.Page})
	if err != nil {
		return htp.RespConvertErr("", err)
	}
	return htp.RespOK("", &struct {
		Total int         `json:"total"`
		Page  int         `json:"page"`
		List  interface{} `json:"list"`
	}{int(req.Count), int(req.Page), req.SchMajor})

}

type NameInfo struct {
	Id   int64  `json:"id"`
	Name string `json:"name"`
}

func GetInfoNew(ctx context.Context, id int64, list []NameInfo) (string, error, []NameInfo) {

	for _, v := range list {
		if v.Id == id {
			return v.Name, nil, list
		}
	}

	idList := make([]int64, 0)
	idList = append(idList, id)
	res, err := mCache.UserCacheServer.UserNameList(ctx, &gupb.UserLoginReqIdsReq{
		Ids: idList,
	})

	if err != nil {
		return "", err, nil
	}

	if len(res.NameList) == 0 {
		return "", nil, list
	}

	var info NameInfo
	info.Id = id
	info.Name = res.NameList[0].Name
	list = append(list, info)
	return res.NameList[0].Name, nil, list

}
